// 类型守卫：
// 字面量类型检查、typeof检查、in检查、instanceof检查、自定义类型守卫 都是类型守卫。
// @target: 在代码块中保证变量属于特定的类型
// 实际应用：在控制流分析的时候，帮助收窄ts类型，便于判断。
/**
 * 自定义类型守卫
 * input is string 依旧是一个boolean类型的。
 */
/**
 * 如果我想判断一个变量是不是一个字符串，
 */
function isString(input: any): input is string {
  return typeof input === "string";
}

function isNumber(input: any): input is number {
  return typeof input === "number";
}

function foo(input: string | number) {
  if (isString(input)) {
    console.log(input);
  } else {
    console.log(input);
  }
}

type Box = {
  _v_isBox: boolean;
  value: any;
};

function isBox(box: any): box is Box {
  return box && box._v_isBox === true;
}
function unWrapBox(box: Box) {
  if (isBox(box)) {
    console.log(box.value);
  }
}

// isRef 和 unRef 就是和isBox和 unWrapBox类似的。
